perm filename HELP0.SAI[PNT,HE]3 blob sn#484537 filedate 1979-10-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "help0"
C00011 ENDMK
C⊗;
BEGIN "help0"
COMMENT THIS PROGRAM TAKES THE DATA RECORDS IN FILE HELP0.DAT AND
	PRODUCES 4 FILES HELP.NUM,HELP.KEY and HELP.DAT
	which are used by the program help ;

COMMENT	XX(ID,KEYWORD,MESSGE)
	YY(LINK_TO);

REQUIRE "[][]" DELIMITERS;

REQUIRE "
Need 10000S in the compiler switches: otherwise you will get a compilation
error for sure; if you see any funny error messages in spite of this,
increase the number by 20% and update this message." MESSAGE;

REQUIRE "HELP0.DAT" SOURCE_FILE;
REQUIRE "
Finished reading data.....
" MESSAGE;

DEFINE II=0;
DEFINE III=0;
DEFINE XX(A,B,C)=[
	REDEFINE II=II+1;
	REDEFINE XXTEMP="define "& "A"&"_X=II";
	XXTEMP;];
DEFINE YY(A)=[
	REDEFINE III=III+1;];

RECORDS;
DEFINE #RECS=II;
DEFINE #LINKS=III;

REDEFINE XX(A,B,C)=[B,];
REDEFINE YY(A)=[];

PRELOAD_WITH RECORDS NULL;
STRING ARRAY KEYWORDS[1:#RECS+1];

REDEFINE XX(A,B,C)=[C,];
PRELOAD_WITH RECORDS NULL;
STRING ARRAY MESSAGES[1:#RECS+1];

REDEFINE II=0;
REDEFINE XX(A,B,C)=[II,];
REDEFINE YY(A)=[REDEFINE II=II+1;];

PRELOAD_WITH RECORDS II;
INTEGER ARRAY INDEX[1:#RECS+1];

REDEFINE XX(A,B,C)=[];
REDEFINE YY(A)=[A,];
PRELOAD_WITH RECORDS 0;
INTEGER ARRAY DATA[1:#LINKS+1];

DEFINE TAB='11,LF='12,CRLF="('15&'12)",CR="'15";
SIMPLE STRING PROCEDURE CVTAB(STRING OLD_STRING);
BEGIN COMMENT convert tabs into relevant number of spaces to fill out;
	INTEGER POSITION,LF_BREAK,TAB_BREAK,BRCHAR,BRCHAR2,I;
	STRING NEW_STRING,TMP_STRING,TMP_STRING2;
	NEW_STRING←NULL;
	SETBREAK(LF_BREAK←GETBREAK,LF,NULL,"INA");
	SETBREAK(TAB_BREAK←GETBREAK,TAB,NULL,"INS");
	TMP_STRING←SCAN(OLD_STRING,LF_BREAK,BRCHAR);
	DO BEGIN
		IF TMP_STRING=CR THEN TMP_STRING←" "&TMP_STRING;
		TMP_STRING2←SCAN(TMP_STRING,TAB_BREAK,BRCHAR2);
		WHILE BRCHAR2=TAB
		    DO BEGIN
			I←8-(LENGTH(TMP_STRING2) MOD 8);
			TMP_STRING2←TMP_STRING2&"        "[1 TO I]
				&SCAN(TMP_STRING,TAB_BREAK,BRCHAR2);
			END;
		NEW_STRING←NEW_STRING&TMP_STRING2;
		TMP_STRING←SCAN(OLD_STRING,LF_BREAK,BRCHAR);
		END UNTIL LENGTH(TMP_STRING)=0 AND BRCHAR=0;
	RELBREAK(LF_BREAK);RELBREAK(TAB_BREAK);
	RETURN(NEW_STRING);
END;

STRING FNUM,FKEY,FDAT,FERR;
INTEGER COUNT,BRCHAR,EOF,FLAG;
INTEGER CHAN;

INTEGER I,PG_COUNTER;
FNUM←"HELP.NUM";
FKEY←"HELP.KEY";
FDAT←"HELP.DAT";
FERR←"HELP.ERR";
COMMENT OUTPUT THE INTEGER ARRAYS;
OPEN(CHAN←GETCHAN,"DSK",'10,0,19,1000,BRCHAR,EOF); COMMENT IMAGE MODE;
ENTER(CHAN,FNUM,FLAG);
WORDOUT(CHAN,#RECS+1);
WORDOUT(CHAN,#LINKS+1);
WORDOUT(CHAN,QUESTION_X);WORDOUT(CHAN,MENU_X);
ARRYOUT(CHAN,INDEX[1],#RECS+1);
ARRYOUT(CHAN,DATA[1],#LINKS+1);
PRINT(CRLF&"WRITING FILE: ",FNUM);
CLOSE(CHAN); RELEASE(CHAN);

COMMENT OUTPUT THE KEYWORDS;
OPEN(CHAN←GETCHAN,"DSK",0,0,19,1000,BRCHAR,EOF); COMMENT TEST MODE;
ENTER(CHAN,FKEY,FLAG);
OUT(CHAN,"COMMENT This file is written by a program. Changes to it will not
	be permanent.  Keep this file UNFORMATTED!!!!!!! and end the comments with
	a percent sign and carriage return.	%
");
FOR I←1 STEP 1 UNTIL #RECS+1 DO
	OUT(CHAN,KEYWORDS[I]&"
");
PRINT(CRLF&"WRITING FILE: ",FKEY);
CLOSE(CHAN); RELEASE(CHAN);

OPEN(CHAN←GETCHAN,"DSK",0,0,19,1000,BRCHAR,EOF); COMMENT TEXT MODE;
ENTER(CHAN,FDAT,FLAG);
OUT(CHAN,"COMMENT The format of this file is as follows: each entry
begins with an ∀ and ends with a ∃.  Within
each entry, the fields are separated by back slashes (\) separating
the entry number, keyword,and the data.  A formfeed is inserted
after every tenth message.  The message area begins after the symbol percent symbol.

	If you make any changes to this file, it will not be permanent.
Please do not insert any new ∀∃\ or percent signs into this file if you write it
with E.  Note also that all tabs are replaced by the right number of spaces.
	
	If this file gets messed up, a fresh copy can be generated by
executing HELP0.SAI.

%
");
PG_COUNTER←0;
FOR I←1 STEP 1 UNTIL #RECS+1 DO
	BEGIN
	PG_COUNTER←PG_COUNTER+1;
	OUT(CHAN,"∀\"&CVS(I)&"\"&KEYWORDS[I]&"\"&CVTAB(MESSAGES[I])&"\"&"∃"&"

");	IF PG_COUNTER=10 THEN BEGIN OUT(CHAN,'14); COMMENT FORMFEED; PG_COUNTER←0; END;
	END;
PRINT(CRLF&"WRITING FILE: ",FDAT&CRLF);
CLOSE(CHAN);RELEASE(CHAN);


COMMENT now we delete HELP0.REL ;
OPEN(CHAN←GETCHAN,"DSK",0,5,5,1000,BRCHAR,EOF);
LOOKUP(CHAN,"HELP0.REL",FLAG);
RENAME(CHAN,NULL,0,FLAG);
CLOSE(CHAN); RELEASE(CHAN);

BEGIN "check usage"
INTEGER UNUSED,#UNUSED,MAXDEPTH;
INTEGER ARRAY USE[1:#RECS+1];

RECURSIVE PROCEDURE CHECKUSAGE(INTEGER I,DEPTH);
IF USE[I]=0 THEN
	BEGIN
	INTEGER J;
	FOR J←INDEX[I]+1 STEP 1 UNTIL INDEX[I+1] 
		DO IF I≠DATA[J] THEN CHECKUSAGE(DATA[J],DEPTH+1);
	MAXDEPTH←MAXDEPTH MAX (DEPTH + 1);
	USE[I]←1;
	END;

MAXDEPTH←#UNUSED←0;
CHECKUSAGE(QUESTION_X,0);
FOR UNUSED←1 STEP 1 UNTIL #RECS DO
	IF USE[UNUSED]=0 THEN #UNUSED←#UNUSED+1;
OPEN(CHAN←GETCHAN,"DSK",0,0,19,1000,BRCHAR,EOF);
ENTER(CHAN,FERR,FLAG);
OUT(CHAN,"UNUSED NODES "&CVS(#UNUSED)&" MAX DEPTH "&CVS(MAXDEPTH));
FOR UNUSED←1 STEP 1 UNTIL #RECS DO IF USE[UNUSED]=0 THEN
	OUT(CHAN,CRLF&"	"&CVS(UNUSED)&"	"&
		(IF KEYWORDS[UNUSED] THEN KEYWORDS[UNUSED] ELSE "	NULL"));
CLOSE(CHAN);
RELEASE(CHAN);
PRINT(CRLF&"WRITING FILE: ",FERR);
END "check usage";

BEGIN "copy help0.dat"
INTEGER CHAN2,BRCHAR2,EOF2,FLAG2;
OPEN(CHAN←GETCHAN,"DSK",'10,19,0,1000,BRCHAR,EOF);
LOOKUP(CHAN,"HELP0.DAT",FLAG);
OPEN(CHAN2←GETCHAN,"DSK",'10,0,19,1000,BRCHAR2,EOF2);
ENTER(CHAN2,"HELP0.ODA",FLAG2);
INOUT(CHAN,CHAN2,-1);
PRINT(CRLF&"HELP0.ODA<==HELP0.DAT");
CLOSE(CHAN);CLOSE(CHAN2);
RELEASE(CHAN);RELEASE(CHAN2);
END;
END "help0";